package com.sakura.模拟;

import java.util.ArrayList;
import java.util.List;

public class Code54_螺旋矩阵 {

    public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };
        System.out.println(spiralOrder(matrix));
        matrix = new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        System.out.println(spiralOrder(matrix));
    }

    public static List<Integer> spiralOrder(int[][] matrix) {
        // l 表示左边界，r表示右边界，t表示上边界，b表示下边界
       int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;

       List<Integer> list = new ArrayList<>();

       while (true) {
           for (int i = l; i <= r; i++) {
               list.add(matrix[t][i]);
           }
           // 收缩上边界，如果上边界大于下边界，则跳出循环
           if (++t > b) break;
           for (int i = t; i <= b; i++) {
               list.add(matrix[i][r]);
           }
           // 收缩右边界，如果左边界大于右边界，则跳出循环
           if (l > --r) break;
           for (int i = r; i >= l; i--) {
               list.add(matrix[b][i]);
           }
           // 收缩下边界，如果上边界大于下边界，则跳出循环
           if (t > --b) break;
           for (int i = b; i >= t; i--) {
               list.add(matrix[i][l]);
           }
           if (++l > r) break;
       }
       return list;
    }
}
